import matplotlib.pylab as plt  # 导入绘图库
import numpy as np  # 导入数值计算库
from scipy.optimize import leastsq  # 导入最小二乘法函数

# 摄氏度,销量
# 23,110
# 27,115
# 31,155
# 33,160
# 35,180

# 从文件中加载数据
data = np.loadtxt(
    "learn_1.csv",       # 文件名
    dtype=float,         # 数据类型为浮点数
    usecols=(0, 1),      # 使用第1列和第2列的数据
    skiprows=1,          # 跳过第1行（标题行）
    encoding="utf8",     # 使用utf8编码读取文件
    delimiter=","        # 使用逗号作为分隔符
)

# 将数据拆分为x和y坐标
x = data[:, 0]  # 摄氏度
y = data[:, 1]  # 销量

def func(x, p):
    """
    定义线性模型函数
    参数:
    x -- 自变量
    p -- 参数列表 [a, b]
    返回:
    返回线性模型的预测值
    """
    a, b = p[0], p[1]
    y = a * x + b
    return y

# 误差
def errors(p, x, y):
    """
    定义误差函数
    参数:
    p -- 参数列表 [a, b]
    x -- 自变量
    y -- 因变量
    返回:
    返回观测值与模型预测值的误差
    """
    _y = func(x, p)
    return y - _y


res = leastsq(errors, [2, 3], args=(x, y))  # 使用最小二乘法拟合模型参数
_a, _b = res[0]  # 获取拟合得到的参数
print("a = ", _a)
print("b = ", _b)

# 绘制散点图
plt.scatter(x, y, color="blue")  # 绘制散点图
plt.plot(x, func(x, [_a, _b]), color="red")  # 绘制拟合曲线

# 显示图形
plt.show()
